{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python for Finance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Analyze Big Financial Data**\n",
    "\n",
    "O'Reilly (2014)\n",
    "\n",
    "Yves Hilpisch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Input-Output Operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.style.use('seaborn')\n",
    "import matplotlib as mpl\n",
    "mpl.rcParams['font.family'] = 'serif'   #导入绘图程序库和定制设置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basic I/O with Python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Writing Objects to Disk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "uuid": "d5bf9798-386b-49b8-a703-36263d9d75d4"
   },
   "outputs": [],
   "source": [
    "path = './'  # 选择文件路径"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "uuid": "c2722e94-01ea-4f98-804f-56fe1b666770"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from random import gauss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "uuid": "7d03b06c-a907-4a16-913f-e6a8f9a05d51"
   },
   "outputs": [],
   "source": [
    "a = [gauss(1.5, 2) for i in range(1000)]    # 生成正态分布随机数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "uuid": "39126a87-5a20-4090-b805-b6b1eb634952"
   },
   "outputs": [],
   "source": [
    "import pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "uuid": "4aa88b7c-3155-4311-9afc-564bf3b06225"
   },
   "outputs": [],
   "source": [
    "pkl_file = open(path + 'data.pkl', 'wb')   #打开可写文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "uuid": "e2611db7-97ed-4162-9cc5-127c7cd89cbd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 1 ms\n"
     ]
    }
   ],
   "source": [
    "%time pickle.dump(a, pkl_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "uuid": "8c9bd301-e980-4eb5-9021-4fde182f5eb7"
   },
   "outputs": [],
   "source": [
    "pkl_file = open(path + 'data.pkl', 'rb')  # 打开只读文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "uuid": "6c8c4ae7-1ece-4b7c-87bc-8457da4798b2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 0 ns\n"
     ]
    }
   ],
   "source": [
    "%time b = pickle.load(pkl_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "uuid": "8bf2e00b-fa06-4524-aa51-6b295fabad00"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[-0.7686778481528997,\n",
       " 2.228363387821805,\n",
       " 2.6253667357856214,\n",
       " 0.4393923464749705,\n",
       " 2.9342522314556527]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "uuid": "253951a8-ecec-4fdf-a502-86cfa1d1186d"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[-0.7686778481528997,\n",
       " 2.228363387821805,\n",
       " 2.6253667357856214,\n",
       " 0.4393923464749705,\n",
       " 2.9342522314556527]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "uuid": "5f558934-6f53-472e-9040-a5c96ee1718d"
   },
   "outputs": [],
   "source": [
    "pkl_file.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Reading and Writing Text Files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "uuid": "32f5b082-2fcb-4090-80ba-174cc347e519"
   },
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "uuid": "39075f54-64cb-42c2-9798-be6638636a15"
   },
   "outputs": [],
   "source": [
    "csv_file = open(path + 'data.csv', 'w')  # 打开可写文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "rows = 500 #定义数据集行数\n",
    "a = np.random.standard_normal((rows, 5)).round(4)  # 创建一个5000行、每行有5个数的正态分布数据，小数后取4位\n",
    "t = pd.date_range(start='2014/1/1', periods=rows, freq='H') #创建一个间隔为1小时的时间索引对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "uuid": "3804898d-dae7-4de0-b0a1-976cd8e43cb3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "header = 'date,no1,no2,no3,no4,no5\\n'  #定义标题行（列标签）\n",
    "csv_file.write(header)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "uuid": "00c96e45-bf91-42d8-b6c9-eb343ee537b7"
   },
   "outputs": [],
   "source": [
    "for t_, (no1, no2, no3, no4, no5) in zip(t, a):      #按行合并数据\n",
    "    s = '%s,%f,%f,%f,%f,%f\\n' % (t_, no1, no2, no3, no4, no5)\n",
    "    csv_file.write(s)\n",
    "csv_file.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "uuid": "b290e5d3-8e56-4d53-acae-51accd08c4f7"
   },
   "outputs": [],
   "source": [
    "csv_file = open(path + 'data.csv', 'r')  # 打开只读文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "uuid": "7b1242f5-5892-44bd-a305-addf9daff316"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "date,no1,no2,no3,no4,no5\n",
      "2014-01-01 00:00:00,-0.652000,-0.694500,-0.626700,1.491300,-2.144200\n",
      "2014-01-01 01:00:00,-0.683100,0.657000,-1.499900,0.405200,0.129300\n",
      "2014-01-01 02:00:00,1.273200,-0.164800,0.817600,-1.652500,-1.089500\n",
      "2014-01-01 03:00:00,1.661900,-0.302300,0.127100,1.399600,-0.258900\n"
     ]
    }
   ],
   "source": [
    "for i in range(5):\n",
    "    print(csv_file.readline(), end='')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "csv_file.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### SQL Databases"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "uuid": "39c9650b-0430-4e66-b461-faecdb511537"
   },
   "outputs": [],
   "source": [
    "import sqlite3 as sq3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "uuid": "cc01fd41-a6c6-426b-b235-42c903ff6c00"
   },
   "outputs": [],
   "source": [
    "con = sq3.connect(path + 'numbs.db')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "query = 'DROP TABLE IF EXISTS numbs'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sqlite3.Cursor at 0x17afe36d8f0>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "uuid": "9e163352-767b-4888-a286-9a79265bb19b"
   },
   "outputs": [],
   "source": [
    "query = 'CREATE TABLE numbs (Date date, No1 real, No2 real)'   #创建一个三列的列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "uuid": "d97dad1a-10cc-43c0-a04a-a5da9b98396b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sqlite3.Cursor at 0x17af55179d0>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "uuid": "cc2e7d31-8239-48b0-b032-f11a514d9349"
   },
   "outputs": [],
   "source": [
    "con.commit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "uuid": "6d76f99f-f6bb-4aad-b386-06946366bbe6"
   },
   "outputs": [],
   "source": [
    "import datetime as dt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "uuid": "a37b7780-d824-4558-b12e-9e5dec6b3056"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sqlite3.Cursor at 0x17afe36d490>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute('INSERT INTO numbs VALUES(?, ?, ?)',\n",
    "            (dt.datetime.now(), 0.12, 7.3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "uuid": "5d882442-b6fb-4788-81b8-9f7814a352ae"
   },
   "outputs": [],
   "source": [
    "data = np.random.standard_normal((1000, 2)).round(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "uuid": "58b51e61-ed1a-4c5e-999a-0f55072e5d32"
   },
   "outputs": [],
   "source": [
    "for row in data:\n",
    "    con.execute('INSERT INTO numbs VALUES(?, ?, ?)',\n",
    "                (dt.datetime.now(), row[0], row[1]))\n",
    "con.commit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "uuid": "667cbd3a-e001-4548-8679-10aec0d31354"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('2020-11-06 11:49:30.677937', 0.12, 7.3),\n",
       " ('2020-11-06 11:49:31.463896', 0.3892, 0.1035),\n",
       " ('2020-11-06 11:49:31.463896', 1.0619, 0.6587),\n",
       " ('2020-11-06 11:49:31.463896', 0.3328, 1.0234),\n",
       " ('2020-11-06 11:49:31.463896', -1.2344, 1.5317)]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute('SELECT * FROM numbs').fetchmany(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "uuid": "3f80d448-2ff3-4e07-80ce-d8971f367a2c"
   },
   "outputs": [],
   "source": [
    "con.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Writing and Reading Numpy Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "uuid": "55cb3a69-0ad9-41eb-9e4f-33ce8a87cf3c"
   },
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "uuid": "d10836fb-aa11-4fb9-8c2c-24d46f48b46b"
   },
   "outputs": [],
   "source": [
    "data = np.random.standard_normal((1000, 6)).round(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "uuid": "2b48a768-2abb-46c1-9499-946e4e43f26e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 2 ms\n"
     ]
    }
   ],
   "source": [
    "%time np.save(path + 'array', data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "uuid": "3bedfde2-d212-40e6-a043-379e416fcc08"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 11 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[ 0.111 , -0.2511,  1.8935,  0.6422, -1.6485,  2.2287],\n",
       "       [ 0.9238,  0.7384,  1.667 ,  0.7103,  2.0673,  1.0395],\n",
       "       [ 1.921 , -0.9053,  0.5849,  0.1739,  0.3538, -0.2987],\n",
       "       ...,\n",
       "       [-1.3332, -0.9881, -0.5392,  1.7172,  3.6602,  1.0478],\n",
       "       [ 0.7345, -0.2955,  0.1899,  0.2393,  0.2876, -0.1487],\n",
       "       [-0.7502,  0.3327, -1.1182, -0.2984, -0.4258,  0.5626]])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%time np.load(path + 'array.npy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "uuid": "b5de422d-014e-4f1f-b80c-4c1333920a57"
   },
   "outputs": [],
   "source": [
    "data = 0.0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## I/O with pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "uuid": "e0ba11e0-7bdf-4e1f-b8a2-0566cb5ab7a7"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "data = np.random.standard_normal((10000, 5)).round(4)\n",
    "        # sample data set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "uuid": "366021ec-1265-4fef-ae96-b280c7f3cd2b"
   },
   "outputs": [],
   "source": [
    "filename = path + 'numbs'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### SQL Database"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "uuid": "ec2ee399-b7d1-4900-b9d8-f4e76492954e"
   },
   "outputs": [],
   "source": [
    "import sqlite3 as sq3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "uuid": "41eac653-cff4-4bab-b27a-18982f4b6159"
   },
   "outputs": [],
   "source": [
    "con = sq3.Connection(filename + '.db')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "query = 'DROP TABLE IF EXISTS numbers'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "uuid": "8c1f7339-7383-4716-b1dc-d18bdd651bfe"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sqlite3.Cursor at 0x17afe41bf10>"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "uuid": "296ae8af-8da3-4f6d-98bd-2816374d8526"
   },
   "outputs": [],
   "source": [
    "query = 'CREATE TABLE numbers (No1 real, No2 real,\\\n",
    "        No3 real, No4 real, No5 real)'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "uuid": "8c1f7339-7383-4716-b1dc-d18bdd651bfe"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sqlite3.Cursor at 0x17afe420ab0>"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "con.execute(query)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "uuid": "c9bd1eba-510d-4b60-89bf-88dd90e96b4f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 858 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "con.executemany('INSERT INTO numbers VALUES (?, ?, ?, ?, ?)', data)\n",
    "con.commit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "uuid": "36c34da0-f8d8-4bf5-8241-45266a118747"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(-0.4054, -1.7665, 0.0206, 0.6488, 1.1535), (0.1847, -1.9551, 1.0735, -0.7691, 0.3617)]\n",
      "Wall time: 35 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "temp = con.execute('SELECT * FROM numbers').fetchall()\n",
    "print(temp[:2])\n",
    "temp = 0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "uuid": "1ed09d3f-24a5-4936-b64c-a205182b5910"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 12 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "query = 'SELECT * FROM numbers WHERE No1 > 0 AND No2 < 0'\n",
    "res = np.array(con.execute(query).fetchall()).round(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "uuid": "d3100151-5563-48ca-8ba6-cc9a623d03cc"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-4.5, 0.5)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "res = res[::100]  # every 100th result\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.plot(res[:, 0], res[:, 1], 'ro')\n",
    "plt.grid(True); plt.xlim(-0.5, 4.5); plt.ylim(-4.5, 0.5)\n",
    "# tag: scatter_query\n",
    "# title: Plot of the query result\n",
    "# size: 60"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### From SQL to pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "uuid": "d446ef85-a7d0-4aba-8b93-d2d60a1aee9b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 316 ms\n"
     ]
    }
   ],
   "source": [
    "%time data = pd.read_sql('SELECT * FROM numbers', con)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "uuid": "052c40c0-6bb7-4084-9e84-da330dca43db"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "      <th>No5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.4054</td>\n",
       "      <td>-1.7665</td>\n",
       "      <td>0.0206</td>\n",
       "      <td>0.6488</td>\n",
       "      <td>1.1535</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.1847</td>\n",
       "      <td>-1.9551</td>\n",
       "      <td>1.0735</td>\n",
       "      <td>-0.7691</td>\n",
       "      <td>0.3617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.4032</td>\n",
       "      <td>-0.4838</td>\n",
       "      <td>-0.4607</td>\n",
       "      <td>1.2811</td>\n",
       "      <td>0.9758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.7599</td>\n",
       "      <td>-0.3888</td>\n",
       "      <td>-1.1012</td>\n",
       "      <td>-0.0159</td>\n",
       "      <td>0.4665</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.4018</td>\n",
       "      <td>-0.1219</td>\n",
       "      <td>0.7040</td>\n",
       "      <td>-1.3311</td>\n",
       "      <td>-0.0853</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      No1     No2     No3     No4     No5\n",
       "0 -0.4054 -1.7665  0.0206  0.6488  1.1535\n",
       "1  0.1847 -1.9551  1.0735 -0.7691  0.3617\n",
       "2 -0.4032 -0.4838 -0.4607  1.2811  0.9758\n",
       "3  1.7599 -0.3888 -1.1012 -0.0159  0.4665\n",
       "4  0.4018 -0.1219  0.7040 -1.3311 -0.0853"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "uuid": "a5f5d023-dfbb-4b54-a622-38a48b3d00a1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 2 ms\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "      <th>No5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.1847</td>\n",
       "      <td>-1.9551</td>\n",
       "      <td>1.0735</td>\n",
       "      <td>-0.7691</td>\n",
       "      <td>0.3617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.7599</td>\n",
       "      <td>-0.3888</td>\n",
       "      <td>-1.1012</td>\n",
       "      <td>-0.0159</td>\n",
       "      <td>0.4665</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.4018</td>\n",
       "      <td>-0.1219</td>\n",
       "      <td>0.7040</td>\n",
       "      <td>-1.3311</td>\n",
       "      <td>-0.0853</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>1.2108</td>\n",
       "      <td>-1.0517</td>\n",
       "      <td>-0.6299</td>\n",
       "      <td>0.5123</td>\n",
       "      <td>-0.4174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>0.6259</td>\n",
       "      <td>-0.0813</td>\n",
       "      <td>0.4126</td>\n",
       "      <td>0.5831</td>\n",
       "      <td>0.0193</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       No1     No2     No3     No4     No5\n",
       "1   0.1847 -1.9551  1.0735 -0.7691  0.3617\n",
       "3   1.7599 -0.3888 -1.1012 -0.0159  0.4665\n",
       "4   0.4018 -0.1219  0.7040 -1.3311 -0.0853\n",
       "11  1.2108 -1.0517 -0.6299  0.5123 -0.4174\n",
       "15  0.6259 -0.0813  0.4126  0.5831  0.0193"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%time data[(data['No1'] > 0) & (data['No2'] < 0)].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "uuid": "2aa6d1e0-e157-4d5b-8a43-3fc696679511"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 3 ms\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "res = data[['No1', 'No2']][((data['No1'] > 0.5) | (data['No1'] < -0.5))& ((data['No2'] < -1) | (data['No2'] > 1))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "uuid": "d46cc119-c34b-4d3f-becd-f625c1a70f78"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-4.162025, 3.5715250000000003, -4.064665, 4.0327649999999995)"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(res.No1, res.No2, 'ro')\n",
    "plt.grid(True); plt.axis('tight')\n",
    "# tag: data_scatter_1\n",
    "# title: Scatter plot of complex query results\n",
    "# size: 55"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data as CSV File"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "uuid": "7925d095-cbde-430b-b2ef-f0f143df15b8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 166 ms\n"
     ]
    }
   ],
   "source": [
    "%time data.to_csv(filename + '.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "uuid": "074e493b-576f-4a3d-a9b5-cafd2045c75c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 146 ms\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\why\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\plotting\\_matplotlib\\tools.py:307: MatplotlibDeprecationWarning: \n",
      "The rowNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().rowspan.start instead.\n",
      "  layout[ax.rowNum, ax.colNum] = ax.get_visible()\n",
      "c:\\users\\why\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\plotting\\_matplotlib\\tools.py:307: MatplotlibDeprecationWarning: \n",
      "The colNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().colspan.start instead.\n",
      "  layout[ax.rowNum, ax.colNum] = ax.get_visible()\n",
      "c:\\users\\why\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\plotting\\_matplotlib\\tools.py:313: MatplotlibDeprecationWarning: \n",
      "The rowNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().rowspan.start instead.\n",
      "  if not layout[ax.rowNum + 1, ax.colNum]:\n",
      "c:\\users\\why\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\plotting\\_matplotlib\\tools.py:313: MatplotlibDeprecationWarning: \n",
      "The colNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().colspan.start instead.\n",
      "  if not layout[ax.rowNum + 1, ax.colNum]:\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[<AxesSubplot:title={'center':'No1'}>,\n",
       "        <AxesSubplot:title={'center':'No2'}>],\n",
       "       [<AxesSubplot:title={'center':'No3'}>,\n",
       "        <AxesSubplot:title={'center':'No4'}>]], dtype=object)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%time\n",
    "pd.read_csv(filename + '.csv')[['No1', 'No2',\n",
    "                                'No3', 'No4']].hist(bins=20);\n",
    "# tag: data_hist_3\n",
    "# title: Histogram of 4 data set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data as Excel File"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "uuid": "735350dc-e6af-4ee7-8f27-2505b3454682"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 3.13 s\n"
     ]
    }
   ],
   "source": [
    "%time data[:10000].to_excel(filename + '.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "uuid": "0d2365b9-28b2-4bb5-8515-4c9ca628ec00"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 1.12 s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAEBCAYAAABR6+96AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAp90lEQVR4nO3deXxU5d3//xfZE7KQhCSEELYELrawuIKiglZxwaq4URWronUp7rW2vbtYf2rb362tWttq1Uq19RYUt6IUFAEVRJFdlgMJa0L2fZ1kMuf7xwSCCGSATGYm834+HjyAyczJ51xk3lxzznU+p4dt24iIiP8K8XUBIiJydApqERE/p6AWEfFzCmoRET+noBYR8XMKahERPxfmrQ0bY/oAjwFjLMs6tYPnvgxkHfRQDnCyZVm7vFWfiEig8FpQAxOB94CxHjx3kWVZcwCMMfHAbIW0iIib14Lasqy3jDGTDn7MGDMSeBjYCAwDHrcsa8f+kG5zC/APb9UlIhJouvoY9UvA85Zl/S/wGvDUwV80xoQAU4APurguERG/5c1DH4czGrjAGHM2EA3UHfL17wMfWJal69pFRNp0dVCvB962LGuDMSYSuOKQr/8QmNHFNYmI+DVvrvo4B3fophtjfon7MMdM4EFjTC6QDrx50PPHArmWZR06yxYRCWo91D1PRMS/6YIXERE/55VDH05nq11Z2eCNTQecxMQYNBZuGot2Got2Got2KSlxPQ73uFdm1GFhod7YbEDSWLTTWLTTWLTTWHRMhz5ERPycglpExM8pqEVE/JyCWkTEzymoRUT8nIJaRMTPebSO2hizEmhq+2urZVnnea8kERE5mKcXvPzXsqxHvFmIiEiwqqhpYvGafO66etxhv+5Rrw9jzDzgK9ytSVdZltVRv2i/ayDy6aef8tRTT5GamsrDDz9MdnY2K1as4A9/+ANTp07ltttu83WJh7V06VIeffRRXn31Vfr163fU57700kvU1dVRU1PDmWeeyXnn6YOPiL+rb2zh4ec+Y3dRLf956rLDXpno6Yz6D5ZlfWWMCQU+NcbUWpb16dFeUFpae6z1etXw4eMYNCibYcOGk5CQRmlpLUOG5DBoUDaXXz7da/WmpMSd0LZHjjyZlJQ0KirqiYw88nY2bfqGzz5bzpNPPovT6eSGG65m8OARxMbGHvf37mwnOhbdicaiXTCPhbPVxTNvbWB3US3nnXTkiZhHQW1Z1ldtv7caYz4DJgNHDeqjmftJLqu2lhzvyw/r1GGpXHNu9nG/fu/ePTzxxG9JTk4mKSmZbdssbrzxFs44YyKvv/4qr7zyIrfccjuWtYX6+jp+//s/Ehoayosv/o2WlhbCw8Npbm7mxz++98C2+vbtS2pqb1avXsu1117Ppk0b2LJlMzNm3MwZZ0zE6XTy7LNPkZiYRF1dHUOGDOXCCy+hubmZ3//+/yMxMYnk5N7U13fc+XXFis8YNWo0AGFhYQwYMJB161YzceI5xz0mIuI9tm3z+kfb2LSzgtFZyUz/3pHzq8NVH8aYYcaYmQc9NATI64Q6/UpmZn8uvfRyQkPDeOCBh7n33gd59915AFx33Y0kJPTizDMn8sgjjwOwffs2AIYNG85dd93DbbfdyZ49u9ixI+/AtgB++ctfcsMNNzFv3hzuuedB7r//oQPbnT//PVpanNx8823MmnUfr776DyorK/jPf94lJiaGu+++n+nTr6e6uvpAnc8++xRvvPGv79RfWVlBTEzMgb/37BlLZWWlV8ZKRE7cwq/2snTdPvqnxnLHZSMJDTlyHHsyo64BLjHG9AXigb3A6ydS4DXnZp/Q7Pd4RUdH09TUdNTn9O8/AIBevRJpaKj/1tcyM7/7tZYWJ3/96zPExSVQWlpKVVV7OPbt6/4oExsbS0aG+89xcfEHXpuXl0t5eRmvvTYbgMGDsygvL2fnzh3065cJQEhICOnpfQ9s8+abf0RY2Hf/2RITk2hoaO9AVl9fR2JiYgcjIiK+sNoq4c0luSTGRXLv1WOIijh6FHcY1JZl7QOmdVaBvpSVNYQVKz7j+ut/CEBzczMOh8Pj1/fo8e3j/LW1tTz22K9ZuHAZ4eHh5OVtP6Z6srOHEBERzowZNwGwbNkS0tPTGTRoEDt2uD+0uFwuCgv3HXiNy9WKbX/3f94JEyYye/aLADidTnbv3sWYMScdUz0i4n079tXw4n82ExEeyr1XjSYxLrLD13T1PRN96qKLprJ58zf89Kf3k5zcG4ejieuuuxGAiopyli//lNraWvLz97Jw4YcUFxfx9ddfUVNTQ11dHfPnv8eQIYa8vO0sXPgho0ePZfLk7/HYY7/GmBHs2rWThQs/ZODAQQe2tXOn+7G8vO1Y1lY+/3wZxcVFrFq1kqlTL+Ovf32Wl19+gdBQd6vHc86ZzNSpl/O73z3K00//L3Fx8cTExPDOO29y1133Mnv2y6SlpTF9+g3f2rdRo3I46aRTeOGFv1BbW8OsWfcRFxfX5WMsIkdWVt3Is/M20NLq4u4rR9M/zbP3qLduxWUH61ncQwXzGe1DaSzaaSzaBctYNDQ5+d2/VlNQVs/15w/lvJO/u8qjS28cICIi7ZytLv727kYKyur53sn9DhvSR6OgFhHxItu2+deibWzaVcnY7N5MP2/IMW9DQS0i4kUfrtzNp+v30T8tlh99fwQhIYc9unFUCmoRES9Z8U0h85btIDk+knuv6ngZ3pEoqEVEvGDTrgpe+XArMZFh3HfNWI+W4R2JglpEpJPtKa7lL29vpEcPuPvKHDJ69zyh7QVNUK9bt4ZZs37EHXfcgtPpBKCkpJjHH3+En//8QXJzj3yxytatW5g160c899zTXVStiASqipomnn5zPU3Nrdw6dQSm/4lfIRw0QT127EmMG3cyISEhPPPMUwCkpqZx0UVTOeusSWRnH/lM7I4duYwdq6v8ROToGppa+NPc9VTVNXPN5GxOG57WKdv1yZWJb+fOZ23Jxk7d5rjUHKZlT+3weQ899AseeeR/WLBgPhdd1P78hoZ6nnvuafr2zaCoqIjTTx/PWWdNAuDiiy/l5Zdf6NR6RaR7aXG6eO7t9rXSU07L7LRtB9Ul5ABRUVH87ndPMmvWj741i3711Vfo168/1103g+bmZq699nLGjDmJ+Ph4H1YrIoHAZdv848MtbN1TxclDU5h+3pDv9AY6ET4J6mnZUz2a/XpL374Z/OIXv+FXv/o5d955NwB5eduZOvUyACIiIoiLi6OgYC/x8SN9VqeIBIZ5y/L4cnMx2RkJ3Hbp8a2VPpqgOUZ9qFNOOY3LL5/GM888CUB29lAKCvIBcDgc1NbW0q9ff1+WKCIBYPHqfBas3ENaUgz3XDWaiPDQTv8eQRPU69evY/36tcybN5fGxkYApk+/gXHj3CcJZ8y4ib179zB79ks8/fSTPPDATw90n1uwYD7r169l06aNvPfe2z7bBxHxL2u3lfL6x9uIjwnngWvGEBsd7pXvo+55XhYsncE8obFop7FoF6hjsW1vFU/NWUdIjx789LpxDEo/8fNZ6p4nItJJ8kvqeOatDbhcNnddMapTQvpoFNQiIsegrKqRp+auo9Hh5JZLhpMzONnr31NBLSLioZqGZp6au57qumamnzeECSP7dMn3VVCLiHig0eHk6bnrKa5o4OLxA7jg1M67oKUjCmoRkQ60OF385Z2N7CqqZeLodK48Z3CXfn8FtYjIUbhsm5c/2Mzmtju0/PBC06lXHXoiaC4hX7duDS+99DxOp5Pnnvs7YWFhlJQU8+KLf6OurpaZM+84bGOmL774nCVLFjNw4GDy8rYzadK5B3qAiEj3Zts2//fRdr7aUsKQfgnccdlIQkO6fn4bNDPq4+2eV1xczMyZt3PddTP48Y/v5bHHfoPL5erK0kXER+av2MXiNflkpPT02lWHnvDJjLr0zTeo/XpVp24z7pRTSbl6eofPO9bueZdffuWB57hcNlFR0YT44H9UEelaS9cV8M5nO0mOj+KBa8bSM8o7Vx16ImgOfex3It3zXn/9n9x//0O+KFtEutBqq4TXFlrERofz4PQTu41WZ/BJUKdcPd2j2a+3HE/3vNdff43Bg7OZNOk8n9UtIt73zc5ynn9vExHhodx/zRj6JMX4uqTgOUZ9qGPpnjd79kukpaUxdeplrFnzNdXVVb4qW0S8aHt+Fc+9vZEePXpwz5WjvX5puKeC5tDH/u55jY2NzJx5O9HR0UyffgPbt1uAu3ven//8J2bPfoni4uID3fPefPMN3nprDgMHDuKdd96irKyUP/3pLyQk9PLtDolIp9pTXMvTb26gtdXmx1fkMHzAid/rsLOoe56XBWpnMG/QWLTTWLTzh7Eoqmjgd/9aTV1DC7d9fwTjR3TNpeGHUvc8EZHDKK9u4sk31lLb0MKMKcZnIX00Hh/6MMZEA18CiyzL+on3ShIR6RrV9c08+cZaKmocXD0pi0njMnxd0mEdy4z6MWCttwoREelK9U0t/HHOOoorG7lkwgAuGj/A1yUdkUdBbYyZASwHdnq3HBER72tqdvL0m+vZW1LH5JMymHZ21zZZOlYdHvowxowAhluW9QtjzGhPN5ySEndChXUnGot2Got2Got2XTkWLc5WHn3pS/IKaph0cj/um35Sp981vLN1uOrDGPM/QCjQDHwPiADetizr6aO8TKs+2vjDGW1/obFop7Fo15Vj4Wx18fx7m1izrZSx2b2564pRhIX6z5qKI6366HBGbVnW4/v/bIyJAmI7CGm/dLzd83bu3MHf/vZnxowZS35+Pmlpadx0060+2AMROREul81L8zezZlspwwckcuflI/0qpI/G4yqNMVcCZwPjjTE/8F5J3nG83fNaWpr5/vev4Prrf8hDD/2cOXNep7S0pCtLF5ET5LJtXvlwC19tKSG7XwJ3X5lDeJhvOuEdD4+X51mWNQ+Y1xnfdMUneezY2rlhN3hYKmecm9Xh8461e97QocMYOnQYAOXlZcTExBAX5x+XlYpIx2zb5rWFFsu/KWJQejz3Xz2GqIjAuig7sKrtBMfbPW/evLksWrSA++9/iKioKF+VLyLHwLZtXv94O8vW7aN/WiwPXDuG6MjAiz2fVHzGuVkezX695Xi651155TVMnXoZt9xyPenpGWRlZfusfhHpmG3bvLkkj8Wr3Y3/H7zWtz2lT0RgHEn3Ak+75y1Z8jH79hUAEBkZSWJiEkVFhT6rW0Q88+5nO/nvV3vokxTDT6aPIy4mwtclHbfA+wxwnI63e15ERCQvvPAXsrOHUllZTlZWNuPHn+HjvRGRo/nPil38Z8UuUntF89APxpHQM3BDGtQ9z+u0XradxqKdxqJdZ4/Ff7/cw9wluSTHR/Gz608iOSFwzimpe56IdHuLV+czd0kuiXGRPHTduIAK6aNRUItIt7B0bQH//mgb8T0jeOgH40jtFe3rkjqNglpEAt7StQW8utAiLiach6aP9Yv7HHamoDmZKCLd05K1Bby2P6R/MI6MlFhfl9TpNKMWkYB1aEj364YhDZpRi0iAWrImn9cWbSO+G8+k9wuaGfW6dWuYNetH3HHHLTidTgBKSop5/PFH+PnPHyQ3d/tRX7979y7OP/9sli//rCvKFZGjCKaQhiAK6uPtngfgcDTx73//U5eNi/iBTw4O6etO6vYhDT469FFZ8BENVZs7dZsxvUaQmHF+h8871u55AH//+1+56aZbeeKJ33ZqzSJybBavzv/WEryM3j19XVKXCLpj1MfaPW/58k8ZPXosffv6592JRYJFsIY0+CioEzPO92j26y3H0j1v7drVZGYO4LXXZlNcXMzSpYtxOls455xzfVa/SLA5OKR/+oNx9A2ikIYgnFHvd3D3vFtvveOI3fN+8YvfHHjNl1+uYNKk8zjzzLN8VbZI0Fn41R7mfJIbtCENQXQycX/3vHnz5tLY2AjA9Ok3MG7cSYC7e97evXuYPfslnn76yQPd8/Z7441/UVxcxCefLGLjxvU+2QeRYPOfFbuY84m7d8fD1wVnSIO653mduqS101i001i0O9xY2LbNO5/tYP6K3STHR/HQdd2rd8eRHPddyEVEupJt28z5JJdFq/aSmhjNQ9O7Txe846WgFhG/4bJt/v3RNpasKSA92X1nlsS4SF+X5XMKahHxCy6XzewFW/l8YyH9UmL5yfSxxAf4nVk6i4JaRHyu1eXi5flbWLm5mIF94njg2rHERgfmjWi9QUEtIj7V4nTx/LubWL2tlOyMBO67egwxUYqmg2k0RMRnmltaeWL2V6zeVsqw/r2456rRREUolg4VNCOybt0aXnrpeZxOJ88993fCwsIoKSnmxRf/Rl1dLTNn3nHYxkyFhft48MG7SUpKBsCY4dx99/1dXb5It9PocPLsWxuw9lYxclASs6blEBke6uuy/FLQBPX+7nmrV6/imWee4sEHHz7QPa+oqPCo3fNuuOEmLr740i6sVqR7q21o5k9z17OrqJYJOencNMUQHhY0198dM58E9YK9pWysqOvUbeYkxXJRZkqHzzue7nnLl39KVVUldXV1nH/+hQwaNLhTaxcJJhU1TTw1Zx2F5Q1MzEnnJzNOoaKi3tdl+bWgmVHvd6zd83r1SmTmzDsYPDiLiopybr/9Zv7xj39/6/JyEfFMcUUDT76xjvKaJi44NZNrz80mNFQz6Y74JKgvykzxaPbrLcfSPW/48JEMHpwFQFJSMomJSeTmbmPcuJN9Vr9IINpTXMsf566npr6ZK84ezNQJA+jR47BXTMshgva/soO75wFH7J63YMF88vJyAXA6nZSWlpCe3tdndYsEou35Vfzh9bXU1Ddz/flDufSMgQrpYxA0hz72d89rbGxk5szbiY6OZvr0G9i+3QLc3fP+/Oc/MXv2SxQXFx/onpeamsY///kyQ4YMJT9/L7feegd9+qT7eG9EAsc3O8p57u2NOFttbrt0BBNG9vF1SQGnw+55xpgQ4D/Al0AEkAXcYllW41Fepu55bdQlrZ3Gol2wjMWqrSX8/f1NhIT04M7LRzE2u/d3nhMsY+GJE+2e94VlWY8BGGPeA6YB/+6k2kSkG1q6roDXFlpEhody71WjMf0TfV1SwDqmftTGmDDcM+vbLcv6+ihP9UqTaxHxf7Zt88Yii9cXWcT3jOC3t00gO7OXr8sKFCfWj9oYMwW4H5jfQUgD6KNMG32sa6exaNddx8LlsnltkcWydfvonRDFg9eOJSEq9Kj72l3H4nikpBx+2a/Hqz4sy1poWdaFwCBjzF2dVZiIdA/NLa385Z2NLFu3j/6psfzPjJNJS4rxdVndQoczamPMCGCQZVkftD20E9CleSJyQF1jC8/O20BufjXDByQya1oO0ZFBs6jM6zwZSQcw0xgzDggHhgP3eLUqEQkYFTVN/HHuevaV1XP6iDRmXjKcMF1t2Kk6DGrLsvJwr/IQEfmWgtI6/jh3PZW1Ds4/JZNrz8smRBeydDp9NhGR47I9v4pn3txAg8PJNZOzmXJapq429BIFtYgcszXbSnnh/U24XDa3Th3OGaN0ta43KahF5Jh8tGovbyzeTkR4KLOuyiFncLKvS+r2FNQi4hGXy+aNxdv5eHU+CbER3HfVGAb0UbvfrqCgFpEOOZpbeeH9TazLLSMjpSf3XTWG5IQoX5cVNBTUInJU1XUOnnlrA7uKahkxMJG7Ls/RXcK7mEZbRI6ooKyep+eup7ymiYk56dx4odEaaR9QUIvIYW3ZVcFz73xDo8PJFWcNYqqa/fuMglpEvmP5xkJmL9gKwG1TRzBhlJr9+5KCWkQOsG2b9z7fyfvLdxETGcasaTkMG6A+0r6moBYRABwtrfzjgy2s2lpC74Qo7rt6DH179/R1WYKCWkSAyloHf57nXtkxpF8CP56WQ3xMhK/LkjYKapEgt6uohmff2kBVXTNn5vThxinDCA/Tyg5/oqAWCWJfby3hpfmbaXG6uHpyFhee1l8rO/yQglokCNm2zfwVu3jns51ERoQy68ocxg1J8XVZcgQKapEg09zSyisLtvLl5mKS4yO556oxZKbG+rosOQoFtUgQqapz8Od5G9lZWEN2hvukYUJPnTT0dwpqkSCxs7CG597eSGWtgwkj+3DTRYbwsFBflyUeUFCLBIHPNxTy6kKL1lYXV03K4qLTddIwkCioRboxZ6uLuZ/k8vHqfGIiw7j9SjX6D0QKapFuqqahmb+98w3W3ioyevdk1pU5pCXG+LosOQ4KapFuaHdRLc+9vYHyGgcnD03hlkuGEx2pt3ug0r+cSDfzxaYiZi/YitPp4oqzB3PJhAGE6Hh0QFNQi3QTrS4Xby7JY9GqvURHhnLn5aMZm93b12VJJ1BQi3QDNfXNvPD+JrbsriQ9OYZZ03JIT1bnu+5CQS0S4HLzq/nbe99QWetg3JDe3Dp1hI5HdzP61xQJULZt8/HqfOZ+kovLtrlqUhYXnt5fx6O7IQW1SABqanYye8FWvtpSQnxMOLdfNorhuhNLt6WgFgkwBWX1/PWdjRSWN5DdL4E7LxtFYlykr8sSL1JQiwSQLzcXM3vBVhwtrVxwaiZXTcoiLFRN/rs7BbVIADj4UvDIiFDuunwUpwxL9XVZ0kU6DGpjTBbwGLAG6AeUW5b1qLcLExG3sqpGnn9/Ezv21ZDRuyd3XTFKS++CjCcz6iTgDcuy3gMwxmw2xnxgWdZq75YmIl9vLeGVBVtpdDiZMDKNG6cMIzJCrUmDTYdBbVnWqkMeCgHqvVOOiAC0OFuZ80kun6wpICI8hFsuHs6ZOX3UmjRI9bBt2+MnG2OuACZZlnVvB0/1fKMi8i0FpXX8/69+zY591QzoE8dPZ5xC/z7xvi5LusZh/yf2+GSiMWYyMBm4z5Pnl5bWerrpbi0lJU5j0UZj0e5IY/HFpiJeXWjhaG7lnLF9+cF5Q4gI7dGtx00/F+1SUuIO+7hHQW2MuQQ4C7gXSDfGDLAs64vOK08kuDmaW/n3x9v4fEMhURGh3P79kZw+Is3XZYmf8GTVx8nAHOBrYAnQE/gLoKAW6QT5JXU8//4m9pXVM6BPHHdcNlIN/uVbPDmZuBrQveRFOpnLtln8dT5vLs3D2erie6f04+pJ2YSH6QIW+TZd8CLiAxU1TTw9dz3f7KwgLiacmy8epd7RckQKapEutnZbKf9caFFT30zO4GRuuWQ4CT0jfF2W+DEFtUgXcTS3MueT7Sxdt4/wsBCuP38o556UobXR0iEFtUgX2FVUw9/f30xRRQP9UmL52U2nEhOqgBbPKKhFvMjlsln41R7e/nQHrS6bC07N5MpzBtO3T7zWDovHFNQiXlJc2cDLH2whN7+ahNgIbr1kBCMHJfm6LAlACmqRTuaybZauLWDuklyaW1ycYlKYMcUQF6MThnJ8FNQinai8uolXFmxh865KekaFcfNFwzlteKpOGMoJUVCLdALbtlm+sYj/W7yNRkcro7OSuemiYfSK1S2y5MQpqEVOUHWdg3/+12JdbhlREaHcfPEwJuakaxYtnUZBLXKcbNvmqy0l/GuRRX2Tk+EDErn54mH0Toj2dWnSzSioRY5DZa2Dfy2yWLu9jIhw98Urk0/KIESzaPECBbXIMbBtm882FDLnk1waHU5MZi9uuniYut2JVymoRTxUUtnA7AVb2bqniujIUG680HD2mL6aRYvXKahFOuBy2Xz09V7e+XQHzU4XY7KSmTHFkBQf5evSJEgoqEWOIr+0jlc+3MrOwhpio8O5+WKti5aup6AWOYzmllbmf7GbBSt30+qyGT8yjR+cN0RXF4pPKKhFDvHNjnJeW2RRWtVEYlwkN04xjFFTf/EhBbVIm6o6B28s3s5XW0oI6dGDKadlctnEQURF6G0ivqWfQAl6LpfNkrUFvP1pHo2OVrL6xjNjiqF/WpyvSxMBFNQS5HYV1fDqfy12FdUSExnGjVMMZ4/VkjvxLwpqCUoNTU7e/WwHi9fkY9swfmQa1547RPcuFL+koJag4rJtlm8oZN6yPGoaWkhLjGbGFMOIgWroL/5LQS1BI29fNa9/tI2dhbVEhIcw7ezBTDktk/CwUF+XJnJUCmrp9qrrm3lraS7LNxYBcNrwVK6ZnK0rCyVgKKil23K2uvhkdT7vLd9Jo6OVfimxXH/+EEz/RF+XJnJMFNTSLX2zs5z/+3g7heUN9IwK44YLhnLO2L6EhoT4ujSRY6aglm6loLSOOUty+WZHBT2ASWP7csXZg3XptwQ0BbV0C9X1zbz72Q4+Xb8P24bhAxK59txsXbQi3YKCWgKao6WVRav28uHK3TiaW0lPjuGaydmMzkpWhzvpNhTUEpBcts3KTUXMW7aDyloHcTHhXDMpi7PG9CUsVMehpXtRUEtAsW2bTbsqmLd0B7uLawkLDeHi8QO4ePwAYqL04yzdU4c/2caYPsBjwBjLsk71fkkih5dXUM28ZXls3VMFwPgRaUw7Z7Du+i3dnidTkInAe8BY75YicngFpXW8/ekO1m4vAyBncDLTzh7MgD46USjBoYdt2x0+yRgzCXjSsqxTPNxuxxsV6UBxRQOvL9zKktV73Ss5BiZx48XDGZWlJv7SbR32DLjXDuqVltZ6a9MBJSUlTmPRxtOxqK5zMH/FbpauK6DVZdMvJZZp5wxmTNtKju4wnvq5aKexaJeScvhPiTr7In6jqs7BgpV7WLqugBani5ReUVxx1mBOG5Gm/tAS1BTU4nNVdQ4+XLmbZev20eJ0kRQfydQJA5k4Ol1L7UTwbNXHOcAMIN0Y80vgKcuyGr1emXR7hwZ0cnwkl5wxkIk5CmiRg3UY1JZlLQOWdUEtEiQqax0sWLmbpev24Wx1kRwfxdQzBnCmAlrksHToQ7rMvrI6Xv/vVpZvLMTZaiugRTykoBav211Uy4crd7PaKsFlQ2qvaC4a318BLeIhBbV4hW3bbN1TxYcrd7NpZwUAgzMSuOCUfpxiUgkJ0SoOEU8pqKVTuWybddvL+HDlbnbsqwFgWP9eXDx+AJNOG0BZWZ2PKxQJPApq6RRNzU4+31DIx1/nU1LlXhQ0bkhvLh4/gKyMBAC1HRU5TgpqOSFl1Y0sXp3Pp+sLaXQ4CQsN4azR6Uw5rT99e/f0dXki3YKCWo6ZbdvkFdSwaNUeVm8rxbYhvmcEU04bxKSxGcT31G2vRDqTglo81uJsZdXWEhavzmdnobs3Q2ZqLBecmslpw9MID9MKDhFvUFBLh0oqG1i6bh+fbyikrrGFHsDY7N5ccGompn8vHXsW8TIFtRyWy2WzPq+MJWsK+KZteV1sdDgXnd6fc8ZlkNpLzfpFuoqCWr6lqs7BZ+v3sWz9PipqHABkZyQw+aQMTjEphIeF+rhCkeCjoBacrS7W55bz+YZ9bNxRgcu2iYwIZdK4DCaPyyAzNdbXJYoENQV1EMsvrePzDYV8samI2oYWAAb2ieOs0emMH9mH6Ej9eIj4A70Tg0xDUwtfbinh8w37DqzciI0O5/xTMpk4Ol2zZxE/pKAOAi3OVjbklbNyUzHr88pxtrro0QNGZyUzMSedsUN6qzmSiB9TUHdTLpfN1j2VrNxczGqrlEaHE4D05BjOGNWHM0alkxgX6eMqRcQTCupuxLZtdhXV8uXmYr7cUkx1XTMAiXGRnDO2L+NHpJGZGqt1zyIBRkEd4Fy2zY6CGr62SlizrZSy6iYAekaFHQjnIZm9dHNYkQCmoA5ArS4X2/ZWs7otnKvaZs7RkaGMH5nGqcNSyRmcrOPOIt2EgjpAOJpb2bK7knW5pazZVkZdo3s5Xc+oMCbmpHOySWHEwCT12xDphhTUfqysupENeeWszy1ny+5KnK0uwN2pbtK4DE42KZjMXpo5i3RzCmo/0upykVdQ4w7nvDIKSusPfK1fSk/GZPdmdFYyWX0TdCsrkSCioPYh27Ypqmhg084KNu+qxNpbSaOjFYDwsBBGZyUzJiuZ0Vm9SU6I8nG1IuIrCuouVl3nYPPuSjbvcodzZa3jwNfSEqMZPyKJnKxkhg9IJDJcDZBEREHtVbZtU1zRwMpvCtm2t4pte6spqmg48PXY6HBOG57KiIFJjBiYSO8EtQ4Vke9SUHcil22zr6ye7Xur2JZfzba9Vd+aMUdFhDJqUBLDByYycmAS/VJjtb5ZRDqkoD5Otm1TWetgZ2ENOwtr236voam59cBz4mLCmZCTzoDUWIZmJpCZGktoiFZoiMixUVB7wLZtquqa2VtSx55idyjvKKw5cIn2funJMQxKj2doZi+G9EugT1IMqanxlJbW+qhyEekOFNSHaHG2sq+sgT0lteSX1LO3pJb80voDF5jslxgXyUlDUxiUHseg9HgG9oknJkrDKSKdL2iTpbahmcLyBooqGihq+72wvJ7SqiZctv2t56b2isZk9qJfaiyZqbEMSo9X5zkR6TLdNqidrS4qah2UVTVSVt1EWXUT5dWNlFQ1UlTeQH2T8zuv6RkVxuCMeDJTYg+EckbvnrrTiYj4lEcJZIz5HjANKAFsy7J+69WqjsK2bRocTqrqmqmuc1Bd10xVvYOq2maq6x1U1Tooq2mistbBIRNjAEJ69CAlMZoh/XrRJzmGPkkxpLf9HhcT0fU7JCLSgQ6D2hgTAzwPjLQsy2GMmWeMOc+yrMUdvda2bVy2jctl43JBq8v99+aWVhwtrTS3uNp+d//d/ctFQ1ML9Y1O6ppaqG9sob7JSX3bn+sanQd6XhxOD6BXXCRDMhJIToimd0IUvXtF0bvtz4lxkeqNISIBxZMZ9QRgt2VZ+xcELwcuAY4Y1Hd8+NWJVxXX9ovwtl/R9AR6eriJ+rZfe3CAwwEl1e7PAyIifijcdvLnS8447Nc8CepU4OD1ZTVtjx1RQquWo4mIHIsw13fPmx34mgevL6Ftbtsmng7mpn+49DytHW6TkhKnsWijsWinsWinseiYJwdrvwAGGGP2r0c7E/jAeyWJiMjBOgxqy7IagDuBZ40xjwEbPDmRKCIincOj5XmWZX0EfOTlWkRE5DC0Tk1ExM8pqEVE/JyCWkTEzymoRUT8nIJaRMTP9bAP17lIRET8hmbUIiJ+TkEtIuLnFNQiIn5OQS0i4ucU1CIifk5BLSLi5xTUIiJ+rlNvr+1PN8H1FmNMFvAYsAboB5RblvWoMSYJ+D2wAxgC/MKyrOK21zyE+4YLicAiy7Leb3t8LPBjYCfuu+b8xLKsI9/mwQ8ZY6KBL3Hv10+MMVHAk0AB7nH4vWVZ29qeewMwDmgF8izLeqHt8YHAr4BcYCDwoGVZdV28KyfMGGOAHwCNwDnAI7jfC9/ZN2NMCPAE7rsnDQRetixrZdt2Avp91PbzPhAow/0zMBOIJgjfH52l02bUB90E937Lsh4BRhtjzuus7fuRJOANy7L+17Kse4HpxpiTcb/pPrYs6/fAu7jDCmPM6cBky7J+BdwHPGWMSTDG9AD+BfzKsqwncIfXD7t8b07cY8Dag/5+H7DHsqzfAX8CXgYwxvQDfoL7zfZT4FZjzJC21zwPvND2mm+Ah7uo9k5jjAkF/gg8alnWH3CH006OvG/XAPGWZT3e9tirxpjQQH8fGWP6AD8H7rYs6ze4b3M6jeB9f3SKzjz0caSb4HYrlmWtsizrvYMeCsF9H91LcN8NB76971P3P942G9iCe7Y1GIi2LKvoMK8JCMaYGbjr3nnQwwfGwbKsjcAYY0w8MAVYbVnW/kthvwAuMsaEA5OBVW2PB9w4tDkV6AHcbYz5OXApUMWR9+3gcaoAmoCRBP77qAFoxj1DBogFNhGE74/O1JlBfcw3wQ10xpgrgIWWZW3l2/tfAyQaY8I48rgE9HgZY0YAwy3LevuQLx3r/vYGGg8K8IAah4MMwB2ys9tmz2fj/gRxpH3rlj8XlmXVAA8Bc4wxs4F83Id9gur90dk6M6iP+Sa4gcwYMxn3bOn+tocO3v94oLJthnCkcQn08boCaDLG/AyYCJxmjLmPY9/fMiC67aPuwY8Hmhpgq2VZ1W1//xwYxZH3rVv+XLQdV34IuMSyrJtw//v+muB7f3SqzgzqoLkJrjHmEtwf5e8F+hhjJuDe1wltTzl43w883vYxfzjwKe6TKo1tx/QOfY3fsyzrccuyHm075vg58JVlWU/z7f3NAda3zbIWAicfFFoTgAWWZbUAS3AfOoAAG4eDfAkktx2rBvcMexNH3reDxykJiGp7fqC/jzKAioNO+hXi3regen90tk7tnmeMOR+4CigFWgLtbLUn2k4cLgO+bnuoJ/AX4H3gD8BuIAv42SFntRPbfi045Kz23W2vSSIAz2obY67EfWY+Avc4vIv7RFEhkA08cciqj1Nwnxjadsiqj1/jfnP2Bx4I0FUfVwDn4v7574/73zaNw+xb26qP3+E+ptsfePGgVR8B+z5q+4/qWdzH3Ktwf6q4D3AQhO+PzqI2pyIifk4XvIiI+DkFtYiIn1NQi4j4OQW1iIifU1CLiPg5BbWIiJ9TUIuI+Ln/B/eeaiiY8gS+AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time pd.read_excel(filename + '.xlsx', 'Sheet1').cumsum().plot()\n",
    "# tag: data_paths\n",
    "# title: Paths of random data from Excel file\n",
    "# size: 60"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}